/*
 * fscan.c
 *
 *  Created on: 17/11/2011
 *      Author: ${Petris-Normandia}
 */

#include "DiscPlanning.h"

void cargarlistaAscendente(nodo** lst,nodo*nodoPila){


nodo* aux;
nodo *nuevo=(nodo*)malloc(sizeof(nodo));
nuevo->info=nodoPila->info;
nuevo->sigu=NULL;






	     if( (*lst == NULL) ||   (nodoPila->info.cylinder < (*lst)->info.cylinder))
	     {
	        // modifico el puntero
	        nuevo->sigu = *lst;
	        *lst = nuevo;
	     }
	     else
	     {
	        aux = *lst;

	        while( (aux->sigu != NULL) && (nodoPila->info.cylinder >= aux->sigu->info.cylinder))
	        {

	           aux = aux->sigu;
	        }
	        nuevo->sigu = aux->sigu;
	        aux->sigu = nuevo;
	     }

}

void cargarlistaDescendente(nodo** lst,nodo* nodoPila){



nodo* aux;
nodo *nuevo=(nodo*)malloc(sizeof(nodo));
nuevo->info=nodoPila->info;
nuevo->sigu=NULL;




			if( (*lst == NULL) || (nodoPila->info.cylinder > (*lst)->info.cylinder))
		     {
		        // modifico el puntero
		        nuevo->sigu = *lst;
		        *lst = nuevo;
		     }
		     else
		     {
		        aux = *lst;

		        while( (aux->sigu != NULL) && (nodoPila->info.cylinder <= aux->sigu->info.cylinder))
		        {

		           aux = aux->sigu;
		        }
		        nuevo->sigu = aux->sigu;
		        aux->sigu = nuevo;
		     }


	}

void fScan(nodo **pilaFscan) {

	nodo* ptraux;
	nodo* extremo;

	pthread_mutex_lock(&mutex_lst1);
	pthread_mutex_lock(&mutex_lst2);
	if ((listaPlanificada1 == NULL) && (listaPlanificada2 == NULL)) {
		if (flagRecorrido == 0) {
			while (*pilaFscan != NULL) {
				ptraux = *pilaFscan;
				if ((*pilaFscan)->info.cylinder >= posactual->cylinder){


					cargarlistaAscendente(&listaPlanificada1, ptraux);

				}
				else{

					cargarlistaDescendente(&listaPlanificada2, ptraux);

					}
				*pilaFscan = (*pilaFscan)->sigu;
				free(ptraux);
				sem_post(&sem1);
				flagRecorrido = 1;
			}
			if(listaPlanificada2==NULL)
				flagRecorrido=0;

		}
		else {
			while (*pilaFscan != NULL) {
				ptraux = *pilaFscan;
				if ((*pilaFscan)->info.cylinder >= posactual->cylinder){


					cargarlistaAscendente(&listaPlanificada2, ptraux);

				}
				else{

					cargarlistaDescendente(&listaPlanificada1, ptraux);

				}
				*pilaFscan = (*pilaFscan)->sigu;
				free(ptraux);
				sem_post(&sem1);
				flagRecorrido = 0;
			}
			if (listaPlanificada2!=NULL)
				flagRecorrido=1;

		}
		if ((listaPlanificada2 != NULL) && (flagRecorrido = 1)) {
			extremo = (nodo*) malloc(sizeof(nodo));
			extremo->info.modo = TIPO_NONPLANNING;
			extremo->info.cylinder = parametros->diskCylinders - 1;
			extremo->info.sector=0;
			extremo->sigu=listaPlanificada2;
			listaPlanificada2=extremo;


		} else if (listaPlanificada2!=NULL) {

			extremo = (nodo*) malloc(sizeof(nodo));
			extremo->info.modo = TIPO_NONPLANNING;
			extremo->info.cylinder = 0;
			extremo->info.sector=0;
			extremo->sigu=listaPlanificada2;
			listaPlanificada2=extremo;


		}
		sem_post(&sem2);
	}
	pthread_mutex_unlock(&mutex_lst1);
	pthread_mutex_unlock(&mutex_lst2);


}






